#coding=utf-8
# Copyright 2011-2012 Maxim Petrov <maximpetrov@yahoo.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 3 or any later version.

from filetree_panel import FileTreePanel, ListTree

import curses

class ConflictsPanel(FileTreePanel):
    """
    Класс работы с панелью конфликтов
    """

    # Горячие клавиши панели рабочей директории.
    # {номер F-клавиши: подпись, ...}
    hotkeys = {7: _(u'Deselect'), 5: _(u'Check')}
    # Пара: номер ревизии, содержимое которой отображается и источник (u'in' или u'out')
    # (обычно None, потому что отображается список конфликтов)
    __revision = None

    def __init__(self, main_win):
        """
        Конструктор класса.
        """

        FileTreePanel.__init__(self, main_win)
        self.__need_update = True

    def set_revision_view(self, revision, source):
        """
        Функция переключает панель конфликтов на отображение изменений
        в заданной ревизии и обратно

        Аргументы:
        revision - ревизия, изменения которой нужно вывести или None для возврата
        source - u'in' или u'out' в зависимости от источника ревизии
        """

        if revision is None:
            self.__revision = None
        else:
            self.__revision = (revision, source)
        self.update()

    def update(self):
        """
        Функция обновления содержимого панели конфликтов.
        """

        if self.__revision is None:
            files = self._window.repo_util.get_merge_conflicts()
            # None возвращается при ошибке, при этом нужно сохранить содержимое
            # неизменным
            if files is not None:
                self.set_files(zip(files, [u' '] * len(files)), True)
        else:
            repo = None
            if self.__revision[1] == u'in':
                repo = self._window.repo_util.bundle_repo
            files = self._window.repo_util.get_changes_for_revision(self.__revision[0], repo)
            if files is not None:
                self.set_files(files)

    def _title(self):
        """
        Функция возвращающая заголовок
        """

        if self.__revision is None:
            return _(u'Conflicts')
        elif self.__revision[1] == u'in':
            return _(u'Incoming') + u':' + unicode(self.__revision[0])
        elif self.__revision[1] == u'out':
            return _(u'Outgoing') + u':' + unicode(self.__revision[0])

    def handle_keypress(self, ch, uni):
        """
        Обработчик нажатия клавиши

        Аргументы:
        ch - нажатая клавиша
        uni - True, если ch - является символом Unicode, False - если нет (например,
        является кодом клавиши не являющейся буквой)
        """

        if ch == curses.KEY_F5:
            self._window._update_inout_panels()
        elif ch == curses.KEY_F12:
            filename = self.get_curpath()
            try:
                if self.__revision is None:
                    if filename is not None:
                        merge_res = self._window.repo_util.\
                                get_merge_conflicts(file=filename)
                        local = False
                        other = False
                        file1 = []
                        file2 = []
                        for l in merge_res.splitlines():
                            if l.startswith('<<<<<<< local'):
                                local = True
                            elif l.startswith('======='):
                                local = False
                                other = True
                            elif l.startswith('>>>>>>> other'):
                                other = False
                            else:
                                if not other:
                                    file1.append([l, local])
                                if not local:
                                    file2.append([l, other])
                        self._window.show_diff_panel([file1, file2],
                                    title=(_(u'local'), _(u'other')))
                else:
                    remote = False
                    if self.__revision[1] == u'in':
                        remote = True
                    files = self._window.repo_util.diff(self.get_curpath(),
                        rev1=self.__revision[0], changes=True, remote_rev1=remote)
                    self._window.show_diff_panel(files,
                        title=(self.get_curpath() + u':' + unicode(self._window.repo_util.get_parent(
                                    self.__revision[0], filename=self.get_curpath(), remote=remote)),
                               self.get_curpath() + u':' + unicode(self.__revision[0])))
            except Exception:
                pass

        elif ch == int(self._window.settings.get(u'Keycodes', u'KEY_SHIFT_F12', False) or -1):
            filename = self.get_curpath()
            try:
                if self.__revision is not None:
                    remote = False
                    if self.__revision[1] == u'in':
                        remote = True
                    files = self._window.repo_util.diff(self.get_curpath(),
                        rev1=self.__revision[0], remote_rev1=remote)
                    self._window.show_diff_panel(files,
                        title=(self.get_curpath() + u':' + unicode(self.__revision[0]),
                           self.get_curpath()))
            except Exception:
                pass
        elif ch == int(self._window.settings.get(u'Keycodes', u'KEY_CONTROL_F12', False) or -1):
            filename = self.get_curpath()
            try:
                if self.__revision is not None:
                    remote = False
                    if self.__revision[1] == u'in':
                        remote = True
                    file = self._window.repo_util.view(self.get_curpath(),
                        rev=self.__revision[0], remote_rev=remote)
                    self._window.show_view_panel(file,
                        title=self.get_curpath() + u':' + unicode(self.__revision[0]))
            except Exception:
                pass
        # Нажат Esc в режиме просмотра ревизии
        elif ch == 27 and self.__revision is not None:
            self.set_revision_view(None, None)
            FileTreePanel.handle_keypress(self, curses.KEY_HOME, False)
        else:
            FileTreePanel.handle_keypress(self, ch, uni)

    def redraw(self, sw, content_only=False):
        """
        Функция перемещения и изменения размера

        Аргументы:
        sw - новый объект subwin
        """

        if self.visible and self.__need_update:
            self.update()
            self.__need_update = False
        FileTreePanel.redraw(self, sw, content_only)
